from rest_framework import serializers

from category.models import Category


class CategorySer(serializers.ModelSerializer):
    """分类序列化器（支持嵌套子分类）]
    核心功能:将数据库中的扁平分类数据，转换为可直接渲染的树形结构
    """
    # 自定义二三级分类字段
    children = serializers.SerializerMethodField()

    class Meta:
        model = Category
        fields = ['id', 'name', 'level', 'sort_order', 'children']

    def get_children(self, obj):
        """
            自定义方法：递归序列化当前分类的子分类
            参数 obj：当前序列化的分类模型实例
            返回值：子分类序列化后的列表（嵌套结构，支持无限层级）
            逻辑：
                1. 筛选当前分类下已启用的子分类
                2. 按 order 字段排序子分类
                3. 递归调用当前序列化器，序列化子分类（子分类包含自身的 children）
        """
        # 1. 筛选当前分类下已启用的子分类
        if obj.children.filter(is_active=1).exists():
            # 2. 递归x序列化子分类，传递上下文
            return CategorySer(
                obj.children.filter(is_active=1),
                many=True,  # 多实例序列化
                context=self.context  # 传递上下文
            ).data
        # 若没有启用的子分类，返回空列表
        return []
